import { message } from 'antd';

/**
 * 统一的错误处理函数
 * @param {Error} error - 错误对象
 * @param {string} defaultMessage - 默认错误消息
 * @param {boolean} showMessage - 是否显示错误消息
 * @returns {string} 错误消息
 */
export const handleError = (error, defaultMessage = '操作失败，请稍后重试', showMessage = true) => {
  console.error('错误详情:', error);
  
  let errorMessage = defaultMessage;
  
  // 网络错误
  if (error.code === 'ECONNABORTED') {
    errorMessage = '请求超时，请检查网络连接';
  } else if (error.code === 'NETWORK_ERROR' || error.message === 'Network Error') {
    errorMessage = '网络连接失败，请检查网络后重试';
  } else if (error.response) {
    // 服务器返回了错误响应
    const status = error.response.status;
    const data = error.response.data;
    
    switch (status) {
      case 400:
        errorMessage = data?.detail || data?.message || '请求参数错误';
        break;
      case 401:
        errorMessage = '用户名或密码错误';
        break;
      case 403:
        errorMessage = '权限不足或账户已被禁用';
        break;
      case 404:
        errorMessage = '请求的资源不存在';
        break;
      case 409:
        errorMessage = data?.detail || data?.message || '资源冲突';
        break;
      case 422:
        errorMessage = data?.detail || data?.message || '输入信息格式错误';
        break;
      case 429:
        errorMessage = '请求过于频繁，请稍后再试';
        break;
      case 500:
        errorMessage = '服务器内部错误，请稍后重试';
        break;
      case 502:
        errorMessage = '服务器网关错误，请稍后重试';
        break;
      case 503:
        errorMessage = '服务暂时不可用，请稍后重试';
        break;
      default:
        if (status >= 500) {
          errorMessage = '服务器暂时不可用，请稍后重试';
        } else {
          errorMessage = data?.detail || data?.message || `请求失败 (${status})`;
        }
    }
  } else if (error.request) {
    // 请求已发出但没有收到响应
    errorMessage = '服务器无响应，请检查网络连接';
  } else {
    // 其他错误
    errorMessage = error.message || defaultMessage;
  }
  
  // 显示错误消息
  if (showMessage) {
    message.error(errorMessage);
  }
  
  return errorMessage;
};

/**
 * 处理登录相关错误
 * @param {Error} error - 错误对象
 * @param {boolean} showMessage - 是否显示错误消息
 * @returns {string} 错误消息
 */
export const handleLoginError = (error, showMessage = true) => {
  return handleError(error, '登录失败，请检查用户名和密码', showMessage);
};

/**
 * 处理注册相关错误
 * @param {Error} error - 错误对象
 * @param {boolean} showMessage - 是否显示错误消息
 * @returns {string} 错误消息
 */
export const handleRegisterError = (error, showMessage = true) => {
  let defaultMessage = '注册失败，请稍后重试';
  
  // 特殊处理注册相关的错误
  if (error.response?.status === 409) {
    defaultMessage = '用户名或邮箱已存在';
  }
  
  return handleError(error, defaultMessage, showMessage);
};

/**
 * 处理API请求错误
 * @param {Error} error - 错误对象
 * @param {string} operation - 操作名称
 * @param {boolean} showMessage - 是否显示错误消息
 * @returns {string} 错误消息
 */
export const handleApiError = (error, operation = '操作', showMessage = true) => {
  return handleError(error, `${operation}失败，请稍后重试`, showMessage);
};

/**
 * 检查是否为网络错误
 * @param {Error} error - 错误对象
 * @returns {boolean} 是否为网络错误
 */
export const isNetworkError = (error) => {
  return (
    error.code === 'NETWORK_ERROR' ||
    error.message === 'Network Error' ||
    error.code === 'ECONNABORTED' ||
    !error.response
  );
};

/**
 * 检查是否为服务器错误
 * @param {Error} error - 错误对象
 * @returns {boolean} 是否为服务器错误
 */
export const isServerError = (error) => {
  return error.response && error.response.status >= 500;
};

/**
 * 检查是否为客户端错误
 * @param {Error} error - 错误对象
 * @returns {boolean} 是否为客户端错误
 */
export const isClientError = (error) => {
  return error.response && error.response.status >= 400 && error.response.status < 500;
};